/**
 * 地图数据辅助工具类
 * 用于管理地图数据的获取、缓存和映射
 */

class MapHelper {
  constructor() {
    // 地图数据缓存
    this.mapDataCache = new Map()
    
    // 省份/城市名称到地图代码的映射
    this.areaCodeMap = {
      // 省份映射
      '北京市': '110000',
      '天津市': '120000',
      '河北省': '130000',
      '山西省': '140000',
      '内蒙古自治区': '150000',
      '辽宁省': '210000',
      '吉林省': '220000',
      '黑龙江省': '230000',
      '上海市': '310000',
      '江苏省': '320000',
      '浙江省': '330000',
      '安徽省': '340000',
      '福建省': '350000',
      '江西省': '360000',
      '山东省': '370000',
      '河南省': '410000',
      '湖北省': '420000',
      '湖南省': '430000',
      '广东省': '440000',
      '广西壮族自治区': '450000',
      '海南省': '460000',
      '重庆市': '500000',
      '四川省': '510000',
      '贵州省': '520000',
      '云南省': '530000',
      '西藏自治区': '540000',
      '陕西省': '610000',
      '甘肃省': '620000',
      '青海省': '630000',
      '宁夏回族自治区': '640000',
      '新疆维吾尔自治区': '650000',
      '台湾省': '710000',
      '香港特别行政区': '810000',
      '澳门特别行政区': '820000',
      
      // 城市映射（主要城市）
      '深圳市': '440300',
      '广州市': '440100',
      '东莞市': '441900',
      '佛山市': '440600',
      '珠海市': '440400',
      '中山市': '442000',
      '惠州市': '441300',
      '江门市': '440700',
      '肇庆市': '441200',
      '汕头市': '440500',
      '韶关市': '440200',
      '湛江市': '440800',
      '茂名市': '440900',
      '梅州市': '441400',
      '汕尾市': '441500',
      '河源市': '441600',
      '阳江市': '441700',
      '清远市': '441800',
      '潮州市': '445100',
      '揭阳市': '445200',
      '云浮市': '445300',
      
      // 其他主要城市
      '苏州市': '320500',
      '无锡市': '320200',
      '常州市': '320400',
      '南京市': '320100',
      '南通市': '320600',
      '连云港市': '320700',
      '淮安市': '320800',
      '盐城市': '320900',
      '扬州市': '321000',
      '镇江市': '321100',
      '泰州市': '321200',
      '宿迁市': '321300',
      
      '杭州市': '330100',
      '宁波市': '330200',
      '温州市': '330300',
      '嘉兴市': '330400',
      '湖州市': '330500',
      '绍兴市': '330600',
      '金华市': '330700',
      '衢州市': '330800',
      '舟山市': '330900',
      '台州市': '331000',
      '丽水市': '331100'
    }
    
    // 地图中心点坐标
    this.centerMap = {
      '中国': [104.114129, 37.550339],
      '广东省': [113.280637, 23.125178],
      '上海市': [121.473701, 31.230416],
      '北京市': [116.405285, 39.904989],
      '深圳市': [114.085947, 22.547],
      '广州市': [113.280637, 23.125178],
      '江苏省': [118.767413, 32.041544],
      '浙江省': [120.153576, 30.287459],
      '山东省': [117.000923, 36.675807]
    }
    
    // 地图缩放级别
    this.zoomMap = {
      '中国': 1,
      '广东省': 1.2,
      '上海市': 1.5,
      '北京市': 1.5,
      '深圳市': 1.8,
      '广州市': 1.5,
      '江苏省': 1.2,
      '浙江省': 1.2,
      '山东省': 1.2
    }
  }
  
  /**
   * 动态获取地图数据
   * @param {string} areaCode - 地区代码
   * @returns {Promise<Object|null>} 地图数据
   */
  async getMapData(areaCode) {
    // 检查缓存
    if (this.mapDataCache.has(areaCode)) {
      console.log(`从缓存获取地图数据: ${areaCode}`)
      return this.mapDataCache.get(areaCode)
    }
    
    try {
      console.log(`正在获取地图数据，区域代码: ${areaCode}`)
      const response = await fetch(`https://geo.datav.aliyun.com/areas_v3/bound/${areaCode}_full.json`)
      
      if (!response.ok) {
        throw new Error(`HTTP error! status: ${response.status}`)
      }
      
      const mapData = await response.json()
      
      // 缓存数据
      this.mapDataCache.set(areaCode, mapData)
      
      console.log(`地图数据获取成功，区域代码: ${areaCode}`)
      return mapData
    } catch (error) {
      console.error(`获取地图数据失败，区域代码: ${areaCode}`, error)
      return null
    }
  }
  
  /**
   * 根据省份/城市名称获取地图代码
   * @param {string} areaName - 地区名称
   * @returns {string|null} 地图代码
   */
  getAreaCode(areaName) {
    return this.areaCodeMap[areaName] || null
  }
  
  /**
   * 动态添加地图代码映射
   * @param {string} areaName - 地区名称
   * @param {string} areaCode - 地图代码
   */
  addAreaCodeMapping(areaName, areaCode) {
    if (areaName && areaCode) {
      this.areaCodeMap[areaName] = areaCode
      console.log(`添加地图代码映射: ${areaName} -> ${areaCode}`)
    }
  }
  
  /**
   * 获取地图中心点坐标
   * @param {string} areaName - 地区名称
   * @returns {Array} 中心点坐标 [经度, 纬度]
   */
  getMapCenter(areaName) {
    return this.centerMap[areaName] || [104.114129, 37.550339]
  }
  
  /**
   * 获取地图缩放级别
   * @param {string} areaName - 地区名称
   * @returns {number} 缩放级别
   */
  getMapZoom(areaName) {
    return this.zoomMap[areaName] || 1
  }
  
  /**
   * 设置地图中心点
   * @param {string} areaName - 地区名称
   * @param {Array} center - 中心点坐标 [经度, 纬度]
   */
  setMapCenter(areaName, center) {
    if (areaName && Array.isArray(center) && center.length === 2) {
      this.centerMap[areaName] = center
      console.log(`设置地图中心点: ${areaName} -> [${center[0]}, ${center[1]}]`)
    }
  }
  
  /**
   * 设置地图缩放级别
   * @param {string} areaName - 地区名称
   * @param {number} zoom - 缩放级别
   */
  setMapZoom(areaName, zoom) {
    if (areaName && typeof zoom === 'number') {
      this.zoomMap[areaName] = zoom
      console.log(`设置地图缩放级别: ${areaName} -> ${zoom}`)
    }
  }
  
  /**
   * 清空地图数据缓存
   */
  clearCache() {
    this.mapDataCache.clear()
    console.log('地图数据缓存已清空')
  }
  
  /**
   * 获取缓存统计信息
   * @returns {Object} 缓存统计信息
   */
  getCacheStats() {
    return {
      cacheSize: this.mapDataCache.size,
      cachedAreas: Array.from(this.mapDataCache.keys()),
      supportedAreas: Object.keys(this.areaCodeMap).length
    }
  }
  
  /**
   * 批量预加载地图数据
   * @param {Array} areaCodes - 地区代码数组
   * @returns {Promise<Array>} 加载结果数组
   */
  async preloadMapData(areaCodes) {
    const results = []
    
    for (const areaCode of areaCodes) {
      try {
        const mapData = await this.getMapData(areaCode)
        results.push({
          areaCode,
          success: !!mapData,
          data: mapData
        })
      } catch (error) {
        results.push({
          areaCode,
          success: false,
          error: error.message
        })
      }
    }
    
    return results
  }
}

// 创建单例实例
const mapHelper = new MapHelper()

export default mapHelper

// 也可以导出类，供其他地方创建新实例
export { MapHelper } 